package testesOxente;

import static org.junit.Assert.*;

import oxente.*;

import org.junit.Assert;
import org.junit.Test;

public class TestaUsuario {
	
	Gerenciador g;

	Usuario usr;
	Usuario usr1;
	Usuario usr2;
	
	public TestaUsuario() throws Exception {

		Gerenciador g = new Gerenciador();

		usr = new Usuario("email", "nome", "senha");
		usr1 = new Usuario("email1", "nome1", "senha1");
		usr2 = new Usuario("email2", "nome2", "senha2");

		g.cadastrarUsuario(usr);
		g.cadastrarUsuario(usr1);
		g.cadastrarUsuario(usr2);

	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario1() throws Exception {
		new Usuario (null, "nome", "senha");
		
	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario2() throws Exception {
		new Usuario ("email", null, "senha");
	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario3() throws Exception {
		new Usuario ("email", "nome", null);		
	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario4() throws Exception {
		new Usuario ("", "nome", "senha");		
	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario5() throws Exception {
		new Usuario (null, "", "senha");		
	}
	
	@Test (expected = Exception.class)
	public void construtorUsuario6() throws Exception {
		new Usuario (null, null, null);		
	}
		
	@Test
	public void testCriaListaDeReproducao() throws Exception {

		Assert.assertTrue(usr.criaListaDeReproducao("forro"));
		Assert.assertTrue(usr.criaListaDeReproducao("samba"));

		Assert.assertFalse(usr.criaListaDeReproducao("forro"));
		Assert.assertFalse(usr.criaListaDeReproducao("samba"));

	}

	@Test
	public void testEliminarListaDeReproducao() throws Exception {

		Assert.assertTrue(usr.criaListaDeReproducao("forro"));
		Assert.assertTrue(usr.criaListaDeReproducao("samba"));

		Assert.assertTrue(usr.eliminarListaDeReproducao("forro"));
		Assert.assertTrue(usr.eliminarListaDeReproducao("samba"));

	}

	@Test
	public void testEliminarTodaListaDeReproducao() throws Exception {

		usr.criaListaDeReproducao("forro1");
		usr.criaListaDeReproducao("samba1");

		usr.eliminarTodaListaDeReproducao();

		Assert.assertTrue(usr.criaListaDeReproducao("forro1"));
		Assert.assertTrue(usr.criaListaDeReproducao("samba1"));

	}

	@Test
	public void testAdicionaAmigo() throws Exception {

		Assert.assertFalse(usr.adicionaAmigo("email"));
		Assert.assertFalse(usr1.adicionaAmigo("email1"));
		Assert.assertFalse(usr2.adicionaAmigo("email2"));

		Assert.assertTrue(usr.adicionaAmigo("email1"));
		Assert.assertTrue(usr.adicionaAmigo("email2"));
		Assert.assertFalse(usr.adicionaAmigo("email1"));
		Assert.assertFalse(usr.adicionaAmigo("email2"));
		Assert.assertFalse(usr.adicionaAmigo("email"));

		Assert.assertTrue(usr1.adicionaAmigo("email2"));
		Assert.assertTrue(usr1.adicionaAmigo("email"));
		Assert.assertFalse(usr1.adicionaAmigo("email"));
		Assert.assertFalse(usr1.adicionaAmigo("email2"));
		Assert.assertFalse(usr1.adicionaAmigo("email1"));

		Assert.assertTrue(usr2.adicionaAmigo("email"));
		Assert.assertTrue(usr2.adicionaAmigo("email1"));
		Assert.assertFalse(usr2.adicionaAmigo("email1"));
		Assert.assertFalse(usr2.adicionaAmigo("email"));
		Assert.assertFalse(usr2.adicionaAmigo("email2"));

	}

	@Test
	public void testBuscarUsuario() throws Exception {

		Assert.assertEquals(usr2, usr1.buscarUsuario("email2"));
		Assert.assertEquals(usr1, usr2.buscarUsuario("email1"));

	}

	@Test
	public void testVerListaDeAmigos() throws Exception {

		Assert.assertTrue(usr.adicionaAmigo("email1"));
		Assert.assertTrue(usr.adicionaAmigo("email2"));

		Assert.assertEquals("1  email1 : nome1\n2  email2 : nome2\n",
				usr.verListaDeAmigos());
	}

	@Test
	public void testEliminarAmigo() throws Exception {

		Assert.assertTrue(usr.adicionaAmigo("email1"));
		Assert.assertTrue(usr.adicionaAmigo("email2"));

		Assert.assertTrue(usr.eliminarAmigo("email1"));
		Assert.assertTrue(usr.eliminarAmigo("email2"));

	}

	@Test
	public void testSetSenha() {

		usr.setSenha("senha2");
		Assert.assertTrue(usr.getSenha().equals("senha2"));

	}

	@Test
	public void testSetNome() {

		usr.setNome("nome2");
		Assert.assertTrue(usr.getNome().equals("nome2"));

	}

	@Test
	public void testGetSenha() {

		Assert.assertTrue(usr.getSenha().equals("senha"));

	}

	@Test
	public void testGetNome() {

		Assert.assertTrue(usr.getNome().equals("nome"));

	}

	@Test
	public void testGetEmail() {

		Assert.assertTrue(usr.getEmail().equals("email"));

	}

	@Test
	public void testEhAmigo() throws Exception {
		assertFalse(usr.ehAmigo(usr1));
		usr.adicionaAmigo(usr1.getEmail());
		
		assertTrue(usr.ehAmigo(usr1));
	}

	@Test
	public void testVerListasDeReproducao() throws Exception {
		assertTrue(usr.verListasDeReproducao().equals("Nao ha listas de reproducao!"));
		usr.criaListaDeReproducao("Lista");
		
		assertTrue(usr.verListasDeReproducao().equals("1 Lista\n"));
	}

	@Test
	public void testRetornaListaDeAmigos() throws Exception {
		usr.adicionaAmigo("email1");
		assertTrue(usr.listaDeAmigos.size() == 1);
		usr.adicionaAmigo("erro");
		assertTrue(usr.listaDeAmigos.size() == 1);
	}

	@Test
	public void testAdicionaMusica() throws Exception {
		Musica m1 = new Musica("a1:a2:a3:a4:a5:a6");
		Musica m2 = new Musica("b1:b2:b3:b4:b5:b6");
		
		ListaDeReproducao ldr = new ListaDeReproducao("Lista");
		
		assertFalse(usr.adicionaMusica(ldr.getNome(), m1.toString()));
		assertFalse(usr.adicionaMusica(ldr.getNome(), m2.toString()));
		
		usr.criaListaDeReproducao("Lista");		
		
		assertFalse(usr.adicionaMusica(ldr.getNome(), m1.toString()));  // False por que a musica deve estar no repositorio!
		assertFalse(usr.adicionaMusica(ldr.getNome(), m2.toString()));  // False por que a musica deve estar no repositorio!
		
		if (Gerenciador.repositorioDeMusicas.size() != 0) {
			Musica m3 = Gerenciador.repositorioDeMusicas.get(0);
			
			assertFalse(usr.adicionaMusica("Lista2", m3.toString()));
			usr.criaListaDeReproducao("Lista2");
			
			assertTrue(usr.adicionaMusica("Lista2", m3.toString()));
		}
		
		
		
	}

}

